#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include"../include/transportADT.h"

#define CANT_HIJOS 5
#define KEY 120

void hijo(int i, long ppid);

void padre(transportADT trans);

int
main(void) {
	long pid;
	transportADT trans;
	int aux=KEY;

	if((trans=openTrans(&aux))!=NULL) {
		pid=getpid();
		printf("Soy papa, mi pid: %d\n",(int)pid);

		int i;
		for (i = 0; i < CANT_HIJOS; i++) {
			if(fork()==0) {
				hijo(i+1,pid);
				exit(1);
			}
		}
		padre(trans);
	}
	else
		printf("Este transporte es una mierda, elegi otro\n");
	return 0;
}

void
hijo(int n, long ppid) {
	transportADT trans;
	char buf1[15]={'S','o','y',' ','e','l',' ','h','i','j','o',' ','n','\0'};
	char buf2[15] = {'N', 'a', 'd', 'a', '\0'};
	buf1[12] = n + '0';

	int pidsend1 = 0, aux=KEY, aux2;

	aux2 = aux + n + 1;

	if ((trans=getTrans(&aux2, &aux)) == NULL) {
		printf("error de transporte en el hijo\n");
		exit(1);
	}

	printf("soy el hijo%d y mi pid es: %d\n", n, (int)getpid());
	if(writeMsg(trans, buf1, 14)==-1) {
		printf("Error escritura hijo%d\n", n);
	}
	if(readMsg(trans, buf2, 9)==-1) {
		printf("Error lectura hijo%d\n", n);
	}
	printf("Soy el hijo%d: papa, con su pid: %d, me mando %s\n", n, (int)pidsend1,buf2);

	closeTrans(trans);
	exit(1);
}

void
padre(transportADT trans) {
	int pidsend1 = 0;
	char buf[16] = {'N', 'a', 'd', 'a', '\0'};
	char buf1[12]={'h','i','j','o','n','g','i','l','\0'};

	int i;
	for (i = 0; i < CANT_HIJOS; i++) {
		if(readMsg(trans, buf, 14)==-1) {
			printf("Error lectura padre %d\n", i);
		}
		printf("Soy el padre, y el pibe del pid: %d, es: %s\n", (int)pidsend1, buf);

		buf1[4] = '0' + i + 1;
		if(writeMsg(trans, buf1, 9)==-1) {
			printf("Error escritura padre\n");
		}
	}

	closeTrans(trans);
}
